package com.cencat.common.enums;

/**
 * 商家等级枚举
 * @author cencat
 * @since 2024-01-01
 */
public enum MerchantLevel {
    
    /**
     * 青铜级商家
     */
    BRONZE(1, "青铜级", "新注册商家，基础服务"),
    
    /**
     * 白银级商家
     */
    SILVER(2, "白银级", "优质商家，享受更多服务"),
    
    /**
     * 黄金级商家
     */
    GOLD(3, "黄金级", "金牌商家，优先推荐"),
    
    /**
     * 铂金级商家
     */
    PLATINUM(4, "铂金级", "顶级商家，专属服务"),
    
    /**
     * 钻石级商家
     */
    DIAMOND(5, "钻石级", "超级商家，全方位支持");
    
    private final Integer code;
    private final String name;
    private final String description;
    
    MerchantLevel(Integer code, String name, String description) {
        this.code = code;
        this.name = name;
        this.description = description;
    }
    
    public Integer getCode() {
        return code;
    }
    
    public String getName() {
        return name;
    }
    
    public String getDescription() {
        return description;
    }
    
    /**
     * 根据代码获取枚举
     * @param code 等级代码
     * @return 商家等级枚举
     */
    public static MerchantLevel getByCode(Integer code) {
        if (code == null) {
            return null;
        }
        for (MerchantLevel level : values()) {
            if (level.getCode().equals(code)) {
                return level;
            }
        }
        return null;
    }
    
    /**
     * 根据名称获取枚举
     * @param name 等级名称
     * @return 商家等级枚举
     */
    public static MerchantLevel getByName(String name) {
        if (name == null || name.trim().isEmpty()) {
            return null;
        }
        for (MerchantLevel level : values()) {
            if (level.getName().equals(name)) {
                return level;
            }
        }
        return null;
    }
    
    /**
     * 检查是否为有效等级
     * @param code 等级代码
     * @return 是否有效
     */
    public static boolean isValid(Integer code) {
        return getByCode(code) != null;
    }
    
    /**
     * 是否为高级商家（黄金级及以上）
     * @return 是否为高级商家
     */
    public boolean isPremium() {
        return this.code >= GOLD.code;
    }
    
    /**
     * 是否为VIP商家（铂金级及以上）
     * @return 是否为VIP商家
     */
    public boolean isVip() {
        return this.code >= PLATINUM.code;
    }
    
    /**
     * 获取下一个等级
     * @return 下一个等级，如果已是最高等级则返回null
     */
    public MerchantLevel getNextLevel() {
        for (MerchantLevel level : values()) {
            if (level.code == this.code + 1) {
                return level;
            }
        }
        return null;
    }
    
    /**
     * 获取上一个等级
     * @return 上一个等级，如果已是最低等级则返回null
     */
    public MerchantLevel getPreviousLevel() {
        for (MerchantLevel level : values()) {
            if (level.code == this.code - 1) {
                return level;
            }
        }
        return null;
    }
}